package com.asia5b.a5mall.app_config

import android.app.Notification
import android.content.Context
import android.widget.RemoteViews
import androidx.core.app.NotificationCompat
import com.alibaba.android.arouter.launcher.ARouter
import com.asia5b.a5bmall.umeng.UmengConfig
import com.asia5b.a5mall.BuildConfig
import com.asia5b.a5mall.R
import com.asia5b.a5mall.middleware.base.BaseApplication
import com.asia5b.a5mall.middleware.config.A5BMallConfigCenter
import com.asia5b.a5mall.middleware.config.GlobalValue
import com.asia5b.a5mall.middleware.utils.WTimeUtils
import com.tencent.bugly.crashreport.CrashReport
import com.umeng.commonsdk.UMConfigure
import com.umeng.message.IUmengRegisterCallback
import com.umeng.message.MsgConstant
import com.umeng.message.PushAgent
import com.umeng.message.UmengMessageHandler
import com.umeng.message.entity.UMessage
import timber.log.Timber

/**
 * Created by zhangyuncai on 2019/12/21.
 */
class ShopApplication : BaseApplication() {

    /**
     * @Note   应用启动时调用
     */
    override fun onCreate() {
        super.onCreate()
//        LiveSdk.initView(this, BuildConfig.DEBUG)
        GlobalValue.isDebug = BuildConfig.DEBUG
        GlobalValue.appType = BuildConfig.appType
        Timber.plant(Timber.DebugTree())
        initRouter()
        initFrame()
        initPush()

        //支付宝沙箱环境配置
//        if (false) {
//            EnvUtils.setEnv(EnvUtils.EnvEnum.SANDBOX)
//        }
        initBugly()

    }

    private fun initBugly() {
        /**
         * 上下文
         * AppID
         * SDK调试模式开关：1、输出详细的Bugly SDK的Log
         * 2、每一条Crash都会被立即上报
         * 3、自定义日志将会在Logcat中输出。
         */
        CrashReport.initCrashReport(this, A5BMallConfigCenter.INSTANCE.BUGLYAPPID, true)

    }

    /**
     * @Note   初始化路由
     * @return rx观察者
     */
    private fun initRouter() {

        if (BuildConfig.DEBUG) {           // 这两行必须写在init之前，否则这些配置在init过程中将无效
            ARouter.openLog()     // 打印日志
            ARouter.openDebug()   // 开启调试模式(如果在InstantRun模式下运行，必须开启调试模式！线上版本需要关闭,否则有安全风险)
        }
        ARouter.init(this) // 尽可能早，推荐在Application中初始化
    }

    private fun initFrame() {
        //Config.DEBUG = true
        UmengConfig.initWechat(A5BMallConfigCenter.INSTANCE.WECHAT_APP_ID, A5BMallConfigCenter.INSTANCE.WECHAT_SCRECT)
    }

    var channelIdInt = 0
    private fun initPush() {
        UMConfigure.init(this, A5BMallConfigCenter.INSTANCE.UMENG_KEY, "Umeng", UMConfigure.DEVICE_TYPE_PHONE, A5BMallConfigCenter.INSTANCE.UMENG_SCRECT)
        /**初始化推送对象*/
        val mPushAgent = PushAgent.getInstance(this)
        /**开启推送*/
        mPushAgent.onAppStart()
        /**设置后台接受通知*/
        mPushAgent.setNotificaitonOnForeground(true)
        /**设置响铃*/
        mPushAgent.notificationPlaySound = MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE
        /**设置呼吸灯闪烁*/
        mPushAgent.notificationPlayLights = MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE
        /**设置是否显示*/
        mPushAgent.notificationPlayVibrate = MsgConstant.NOTIFICATION_PLAY_SDK_ENABLE
        /**设置推送信息监听器*/
        mPushAgent.messageHandler = object : UmengMessageHandler() {

            override fun getNotification(context: Context, uMessage: UMessage?): Notification {
                val channelId = "${channelIdInt++}"
                //todo 必须使用此创建对象,适配8.0(构造函数要求您提供一个通道ID。为了与Android 8.0（API级别26）及更高版本兼容，这是必需的，但较早版本会忽略。)
                val builder: NotificationCompat.Builder = NotificationCompat.Builder(context, channelId)

                /**自定义通知样式*/
                val myNotificationView = RemoteViews(context.packageName, R.layout.notification_lay)
                myNotificationView.setTextViewText(R.id.notification_time, WTimeUtils.DataMilltoString(System.currentTimeMillis(), "YYYY-MM-DD"))
                myNotificationView.setTextViewText(R.id.notification_content, uMessage!!.text)
                builder.setContent(myNotificationView)
                        .setSmallIcon(getSmallIconId(context, uMessage))
                        .setTicker(uMessage.ticker)
                        .setAutoCancel(true)
                return builder.build()
            }


        }

        //注册推送服务，每次调用register方法都会回调该接口
        mPushAgent.register(object : IUmengRegisterCallback {

            override fun onSuccess(deviceToken: String) {
                //注册成功会返回device token
            }

            override fun onFailure(s: String, s1: String) {
            }
        })
    }

}